﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;


namespace BLL
{
    public class BLLLocal
    {
        public List<BTO.Local> list()
        {
            DALLocal locais = new DALLocal();
            return locais.list();
        }

        public BTO.Local getByID(int id)
        {
            DALLocal dalLocal = new DALLocal();
            BTO.Local btoLocal = dalLocal.getByID(id);

            if (btoLocal == null) {
                throw new NotFoundLocalException("Local não encontrado!");
            }

            return btoLocal;
        }

        public List<BTO.Local> getByPais(String pais)
        {
            DALLocal dalLocal = new DALLocal();
            List<BTO.Local> btoLocais = dalLocal.getByPais(pais);

            if (btoLocais.Count() == 0) {
                throw new NotFoundLocalException("Nenhum local encontrado deste país!");
            }

            return btoLocais;
        }

        public void insert(BTO.Local toInsert)
        {
            DALLocal dalLocal = new DALLocal();

            try
            {
                dalLocal.insert(toInsert);
            }
            catch (Exception e) {
                throw new InsertLocalException(e.Message);
            }

        }

        public void update(BTO.Local toUpdate)
        {
            DALLocal dalLocal = new DALLocal();

            try
            {
                dalLocal.update(toUpdate);
            }
            catch (Exception e) {
                throw new UpdateLocalException(e.Message);
            }
        }

        public void delete(int id)
        {
            DALLocal dalLocal = new DALLocal();            
            DALReserva dalReserva = new DALReserva();
            DALAlojamento dalAlojamento = new DALAlojamento();
            DALTransporte dalTransporte = new DALTransporte();
            List<BTO.Reserva> listReservas;
            List<BTO.Transporte> listTransporte;

            listReservas = dalReserva.getByIDChegada(id);
            if (listReservas.Count() > 0)
            {
                throw new ReservasAssociadasIDChegadaException("Existem reservas associadas à este destino!");
            }

            listReservas = dalReserva.getByIDPartida(id);
            if (listReservas.Count() > 0)
            {
                throw new ReservasAssociadasIDPartidaException("Existem reservas associadas à esta origem!");
            }

            List<BTO.Alojamento> listAlojamento = dalAlojamento.getByIDLocal(id);
            if (listAlojamento.Count() > 0)
            {
                throw new AlojamentosAssociadosIDLocalException("Existem Alojamentos associados à este local!");
            }

            listTransporte = dalTransporte.getByIDChegada(id);
            if (listTransporte.Count() > 0)
            {
                throw new TransportesAssociadosIDChegadaException("Existem transportes associados à este destino!");
            }

            listTransporte = dalTransporte.getByIDChegada(id);
            if (listTransporte.Count() > 0)
            {
                throw new TransportesAssociadosIDPartidaException("Existem transportes associados à esta origem!");
            }


            try
            {
                dalLocal.delete(id);
            }
            catch (Exception e) {
                throw new DeleteLocalException(e.Message);
            }
        }
    }
}
